// 配置路由
import Vue from "vue"
import VueRouter from "vue-router"
import routes from "@/router/routes.js"
import store from "@/store/index.js"

// 使用路由插件
Vue.use(VueRouter)


// 先把VueRouter原型对象的 push 保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递那些参数）
// 第二个参数：成功的回调
// 第三个参数：失败的回调
  // call||apply区别
  // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
  // 不同点，call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
  if(resolve && reject) {

    originPush.call(this, location, resolve, reject)
  }else {
    originPush.call(this, location, ()=>{}, ()=>{})
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if(resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  }else {
    originReplace.call(this, location, ()=>{}, ()=>{})
  }
}

// 暴露路由对象
let router = new VueRouter({
  // 配置路由
  routes,
  scrollBehavior () {
    // 返回的y=0，表示滚动条返回页面最上方
    return { y: 0 }
  }
})

// 全局守卫：前置守卫
router.beforeEach(async(to, from, next) => {
  let token = store.state.user.token
  if(token) {
    // 用户已经登录
    // 用户登录之后还想去登录页------不行，强制路由到home首页
    if(to.path == '/login' || to.path == '/register') {
      next('/')
    } else {
      // 没有用户信息
        let name = store.state.user.userInfo.name
        if(name) {
          // 如果用户名已经有了，直接放行
          next()
        } else {
          // 如果没有，发请求派发action获取数据
          try {
          // 获取用户信息在成功 
          await store.dispatch('getUserInfo')
          next()
          } catch (error){
            // token失败了，获取不到用户信息，需要重新登陆（登录已过期）
            // 派发action清除本地储存的token
            await store.dispatch('userLogout')
            // 清除之后强制路由到登录页
            next('/login')
          }
        }
    }
  } else {
    // 未登录:不能去与交易相关的页面，购物车
    let toPath = to.path
    if(toPath.indexOf('/center')!= -1  || toPath == '/shopcart' || toPath == '/trade' || toPath.indexOf('/pay')!= -1 ) {
      // 把未登录的时候想去的路由存储与地址栏中，即路由【query】参数
      next('/login?redirect=' + toPath)
    } else {
      // 去搜索等页面
      next()
    }
  }
  // 测试部分，允许通过
  // next()
})

export default router


